import type { Rule as ValidationRule } from "antd/lib/form";
import type { ComponentType } from "./types";
import { isNumber, isObject } from "@/utils/is";
import moment from "moment";

/**
 * @description: 生成placeholder
 */
export function createPlaceholderMessage(component: ComponentType, t: Fn) {
	if (component.includes("Input") || component.includes("Complete")) return t("component.form.inputPlaceholder");

	if (component.includes("Picker")) return t("component.form.selectPlaceholder");

	if (
		component.includes("Select") ||
		component.includes("Cascader") ||
		component.includes("Checkbox") ||
		component.includes("Radio") ||
		component.includes("Switch")
	) {
		return t("component.form.selectPlaceholder");
	}
	return "";
}

const DATE_TYPE = ["DatePicker", "MonthPicker", "WeekPicker", "TimePicker"];

function genType() {
	return [...DATE_TYPE, "RangePicker"];
}

export function setComponentRuleType(rule: ValidationRule, component: ComponentType, valueFormat: string) {
	if (Reflect.has(rule, "type")) return;
	if (["DatePicker", "MonthPicker", "WeekPicker", "TimePicker"].includes(component))
		rule.type = valueFormat ? "string" : "object";
	else if (["RangePicker", "Upload", "CheckboxGroup", "TimePicker"].includes(component)) rule.type = "array";
	else if (["InputNumber"].includes(component)) rule.type = "number";
}

export function processDateValue(attr: Recordable, component: string) {
	const { valueFormat, value } = attr;
	if (valueFormat) attr.value = isObject(value) ? moment(value as unknown as Date).format(valueFormat) : value;
	else if (DATE_TYPE.includes(component) && value) attr.value = moment(attr.value);
}

export function handleInputNumberValue(component?: ComponentType, val?: any) {
	if (!component) return val;
	if (["Input", "InputPassword", "InputSearch", "InputTextArea"].includes(component))
		return val && isNumber(val) ? `${val}` : val;

	return val;
}

/**
 * 时间字段
 */
export const dateItemType = genType();

export const defaultValueComponents = ["Input", "InputPassword", "InputSearch", "InputTextArea"];

// TODO 自定义组件封装会出现验证问题，因此这里目前改成手动触发验证
export const NO_AUTO_LINK_COMPONENTS: ComponentType[] = [
	"Upload",
	"ApiTransfer",
	"ApiTree",
	"ApiTreeSelect",
	"ApiRadioGroup",
	"ApiCascader",
	"AutoComplete",
	"RadioButtonGroup",
	"ImageUpload",
	"ApiSelect"
];
